package com.king.juc.fivetest;

/**
 * 案例4
 * @author king
 * @date 2020/11/28 20:49
 */
public final class SingletonFour {
    private SingletonFour(){}
    // 问题1: 解释为什么要加 volatile?
    // 答: 防止指令重排
    private static volatile SingletonFour INSTANCE = null;

    // 问题2: 对比案例3, 说出这样做的意义
    // 答: 同步代码块范围缩小, 性能提升
    public static SingletonFour getInstance(){
        if(INSTANCE != null){
            return INSTANCE;
        }

        synchronized (SingletonFour.class){
            // 问题3: 为什么还要在这里加判空, 之前不是判断过了吗
            // 答: 防止并发问题
            if (INSTANCE != null){
                return INSTANCE;
            }
            INSTANCE = new SingletonFour();
            return INSTANCE;
        }
    }
}
